﻿/*829. 模拟队列

实现一个队列，队列初始为空，支持四种操作：
push x – 向队尾插入一个数 x
pop – 从队头弹出一个数；
empty – 判断队列是否为空；
query – 查询队头元素。

现在要对队列进行 M个操作，其中的每个操作都要输出相应的结果。

输入格式
第一行包含整数 M，表示操作次数。
接下来 M行，每行包含一个操作命令，操作命令为 push x，pop，empty，query 中的一种。

输出格式
对于每个 empty 和 query 操作都要输出一个查询结果，每个结果占一行。
其中，empty 操作的查询结果为 YES 或 NO，query 操作的查询结果为一个整数，表示队头元素的值。

数据范围
1≤M≤100000,1≤x≤109


输入样例：
10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6
输出样例：
NO
6
YES
4*/

#include<iostream>
using namespace std;
const int N = 100010;
int q[N], hh, tt;

int main()
{
    tt=-1;//hh=0,tt=-1
//一般循环队列，tt初始化成0，队列中的所有元素是q[hh], q[hh + 1], ..., q[tt - 1]；
//不循环的队列，tt一般初始化成-1，队列中的所有元素是q[hh], q[hh + 1], ..., q[tt]。
    int n;
    cin >> n;
    int x;
    string op;
    while (n--)
    {
        cin >> op;
        if (op == "push")
        {
            //队尾入队，先入先出
            cin >> x;
            q[++tt] = x;//tt从1开始，指向队头
        }
        else if (op == "pop")
        {
            hh++;
        }
        else if (op == "query")//查询队头
        {
            cout << q[hh] << endl;
        }
        else//empty
        {
            if (hh <= tt)  cout << "NO" << endl; //if(tt)   (hh>=tt)
            else    cout << "YES" << endl;
        }
    }
    return 0;
}

/*和栈对比
栈：tt初始为0，判空：tt==0为空
队列：tt初始为-1，hh=0，判空：hh>=tt为空

tt=-1和tt=0
tt=-1: q[hh]  hh <= tt not empty
tt=0: qq[hh+1] hh<tt not empty
*/